package com.zenithmind.version.pojo.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 合并请求统计信息实体类 - 遵循单一职责原则，专门处理合并请求统计数据
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("version_merge_request_statistics")
@Schema(description = "合并请求统计信息实体")
public class MergeRequestStatistics extends BaseEntity {

    /**
     * 合并请求ID
     */
    @Schema(description = "合并请求ID")
    private String mergeRequestId;

    /**
     * 变更文件数量
     */
    @Schema(description = "变更文件数量")
    private Integer changedFiles;

    /**
     * 新增行数
     */
    @Schema(description = "新增行数")
    private Integer addedLines;

    /**
     * 删除行数
     */
    @Schema(description = "删除行数")
    private Integer deletedLines;

    /**
     * 提交数量
     */
    @Schema(description = "提交数量")
    private Integer commitCount;

    /**
     * 评论数量
     */
    @Schema(description = "评论数量")
    private Integer commentCount;

    /**
     * 指派者ID列表（JSON格式）
     */
    @Schema(description = "指派者ID列表（JSON格式）")
    private String assigneeIds;

    /**
     * 指派者名称列表（JSON格式）
     */
    @Schema(description = "指派者名称列表（JSON格式）")
    private String assigneeNames;

    /**
     * 标签（JSON格式）
     */
    @Schema(description = "标签（JSON格式）")
    private String labels;

    /**
     * 里程碑
     */
    @Schema(description = "里程碑")
    private String milestone;

    /**
     * 合并提交哈希
     */
    @Schema(description = "合并提交哈希")
    private String mergeCommitHash;

    /**
     * 合并者名称
     */
    @Schema(description = "合并者名称")
    private String mergedByName;

    /**
     * 关闭者名称
     */
    @Schema(description = "关闭者名称")
    private String closedByName;

    /**
     * 获取总变更行数
     * 
     * @return 总变更行数
     */
    public int getTotalChangedLines() {
        int added = addedLines != null ? addedLines : 0;
        int deleted = deletedLines != null ? deletedLines : 0;
        return added + deleted;
    }
    
    /**
     * 获取净变更行数（新增 - 删除）
     * 
     * @return 净变更行数
     */
    public int getNetChangedLines() {
        int added = addedLines != null ? addedLines : 0;
        int deleted = deletedLines != null ? deletedLines : 0;
        return added - deleted;
    }
    
    /**
     * 检查是否为大型合并请求
     * 
     * @return 是否为大型合并请求（变更超过200行或文件超过20个）
     */
    public boolean isLargeMergeRequest() {
        return getTotalChangedLines() > 200 || 
               (changedFiles != null && changedFiles > 20);
    }
    
    /**
     * 检查是否有评论
     * 
     * @return 是否有评论
     */
    public boolean hasComments() {
        return commentCount != null && commentCount > 0;
    }
    
    /**
     * 检查是否有多个提交
     * 
     * @return 是否有多个提交
     */
    public boolean hasMultipleCommits() {
        return commitCount != null && commitCount > 1;
    }
    
    /**
     * 获取平均每个文件的变更行数
     * 
     * @return 平均变更行数
     */
    public double getAverageChangesPerFile() {
        if (changedFiles == null || changedFiles == 0) {
            return 0.0;
        }
        return (double) getTotalChangedLines() / changedFiles;
    }
    
    /**
     * 获取复杂度评分（基于变更量和文件数）
     * 
     * @return 复杂度评分（1-5）
     */
    public int getComplexityScore() {
        int totalChanges = getTotalChangedLines();
        int files = changedFiles != null ? changedFiles : 0;
        
        if (totalChanges < 50 && files < 5) {
            return 1; // 简单
        } else if (totalChanges < 100 && files < 10) {
            return 2; // 较简单
        } else if (totalChanges < 200 && files < 20) {
            return 3; // 中等
        } else if (totalChanges < 500 && files < 50) {
            return 4; // 复杂
        } else {
            return 5; // 非常复杂
        }
    }
}
